{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 03\n",
    "\n",
    "# 阿基米德估算圆周率\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "781d5820-c05a-4967-a451-75402545474a",
   "metadata": {},
   "source": [
    "该代码通过增大正多边形的边数，逐步计算对圆周率$\\pi$的近似上界和下界，并展示它们的收敛过程。具体来说，代码从一个初始六边形开始，计算其内接与外接多边形的周长，分别作为$\\pi$的下界和上界估计。随着正多边形的边数依次增大为$6, 12, 24, 48, 96$，代码利用递推公式不断更新对$\\pi$的上下界估计：\n",
    "\n",
    "- 下界公式为：\n",
    "  $$\n",
    "  B_n = n \\cdot \\sin\\left(\\frac{\\pi}{n}\\right)\n",
    "  $$\n",
    "\n",
    "- 上界公式为：\n",
    "  $$\n",
    "  A_n = n \\cdot \\tan\\left(\\frac{\\pi}{n}\\right)\n",
    "  $$\n",
    "\n",
    "然后，迭代更新上下界，以更接近$\\pi$的真实值，更新公式为：\n",
    "\n",
    "$$\n",
    "A_{i+1} = \\frac{2 \\cdot A_i \\cdot B_i}{A_i + B_i}\n",
    "$$\n",
    "$$\n",
    "B_{i+1} = \\sqrt{A_i \\cdot B_i}\n",
    "$$\n",
    "\n",
    "这些公式的作用是不断缩小上界和下界之间的间隔，使其逐渐逼近$\\pi$。随着正多边形边数的增加，内接和外接多边形的周长逐渐收敛到$\\pi$，这一过程在图形中显示为蓝色和绿色曲线的逐渐靠近，并填充了它们之间的区域。\n",
    "\n",
    "该图形直观展示了正多边形的边数趋向无穷大时对$\\pi$的估计，反映出几何逼近法的收敛特性。这种方法体现了通过几何构造逐步逼近$\\pi$的思想。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "777f24bb-6522-4b88-9343-be1c00ad409b",
   "metadata": {},
   "outputs": [],
   "source": [
    "## 使用正多边形边数变化逐步逼近$\\pi$的估计值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5ea1e46a-95b6-481f-ba15-73bf80a0ebe4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7dc8bbd6-c49d-451d-b99e-77625f2757db",
   "metadata": {},
   "outputs": [],
   "source": [
    "n_start = 6  # 初始边数\n",
    "\n",
    "B_6 = np.sin(np.pi / n_start) * n_start  # 初始下界\n",
    "A_6 = np.tan(np.pi / n_start) * n_start  # 初始上界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c04694ca-7333-43a4-9d05-3a43b25e5095",
   "metadata": {},
   "outputs": [],
   "source": [
    "B_array = []  # 存储$\\pi$的下界估计值\n",
    "A_array = []  # 存储$\\pi$的上界估计值\n",
    "n_array = [6, 12, 24, 48, 96]  # 边数的变化序列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fc297f9a-7eae-4e22-8a38-6c597e2928b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "B_i = B_6  # 初始化下界\n",
    "A_i = A_6  # 初始化上界\n",
    "n_i = n_start  # 初始化边数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4a15b619-5e4c-4895-9190-cc50b340530c",
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in n_array:\n",
    "    B_array.append(B_i)  # 记录当前下界\n",
    "    A_array.append(A_i)  # 记录当前上界\n",
    "    \n",
    "    # 更新上下界\n",
    "    A_i = 2 * A_i * B_i / (A_i + B_i)\n",
    "    B_i = np.sqrt(A_i * B_i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bf49acc5-8c00-4620-91e1-8f491fffae9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "B_array = np.array(B_array)  # 转换为数组\n",
    "A_array = np.array(A_array)  # 转换为数组\n",
    "n_array = np.array(n_array)  # 转换为数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "13a8c9b9-a5ae-42e3-9167-f244044465e3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(42.597222222222214, 0.5, 'Estimate of $\\\\pi$')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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qEWLFmrQoIHCwsJ07bXX6o033lCHDh0quVIAcImNjVX79u01duxY7dq1Sw6HQx9++KGWLFmizMxM7d27V0eOHNH48eN17bXXavbs2frLX/6im2++WQsWLCjxdUIq8D34HafTqbS0ND3//POSpHbt2mndunWaMmWK7rrrLourKyo/P19//etf5XQ69cYbb1hdjuX69++vNWvWaNGiRZ5tK1as0OTJk7Vy5UoZhmFhdahqduzYoYEDB2r27NlnvC/nlVde0eLFi/XVV1+pYcOGWrhwoR555BHVq1ev2BZHAKgMH3zwge677z6dd955stvtuvDCC3XnnXdq5cqVcjqdkqQbb7xRgwcPliS1bdtWP//8s95880117NixRNcIqhbEevXqqUWLFl7bUlJSSjWqp7Lk5+fr9ttv19atWzVnzpygbz189NFH9dVXX2nevHlq0KCBZ/uPP/6ovXv36vzzz1dISIhCQkK0bds2DRkyRI0aNbKuYPi9FStWaO/evbrooos8vzsLFizQK6+8opCQEOXm5mr48OF66aWX1LNnT6Wmpqp///7q3bu3XnzxRavLBxDEmjZtqgULFujIkSPasWOHli5dqvz8fDVu3Fg1a9ZUSEhIufNOULUgXnHFFUWmSPntt9/UsGFDiyoqnjscbtq0SfPmzVNCQoLVJVnGNE09+uijmjFjhubPn6/GjRt7vd6nT58iLTndu3dXnz59dO+991ZmqahiOnfurIyMDK9t9957r5KTk/Xkk0/K4XAoPz9fNpv3/0fb7XbP/6EDgJWio6MVHR2tQ4cO6bvvvtO//vUvhYWF6eKLLy533gmqgDh48GBdfvnlev7553X77bdr6dKlevvtt/X2229Xah1HjhzR5s2bPc+3bt2q9PR01ahRQ/Xr19ett96qlStX6ptvvpHD4dDu3bsluQZmhIWFVWqtVuvXr5/++9//6ssvv1RsbKzns4iPj1dkZKQSEhKKBOjQ0FDVrVtXSUlJVpSMKiI2NtbrXlbJ9Y9tQkKCZ3vHjh01dOhQRUZGqmHDhlqwYIGmTZuml156yYqSAUCS9N1338k0TSUlJWnz5s0aOnSokpKSPA0jQ4cOVe/evXXVVVfpmmuu0axZs/T1119r/vz5Jb9IucZAV0Fff/212apVKzM8PNxMTk4233777UqvYd68eaakIo+7777b3Lp1a7GvSTLnzZtX6bVa7UyfxdSpU894DNPcoKxOn+YmMzPTvOeee8z69eubERERZlJSkjlx4kTT6XRaVySAoPe///3PbNKkiRkWFmbWrVvX7Nevn3n48GGvfd577z2zWbNmZkREhNmmTRvziy++KNU1DNM0TZ/EWQAAAASEoBqkAgAAgHMjIAIAAMALAREAAABeCIgAAADwQkAEAACAFwIiAAAAvBAQAQAA4IWACAAAAC8ERAAB748//pBhGEpPT7e6FI9ff/1Vl112mSIiItS2bdtSH3/PPffopptuOus+V199tQYNGlSm+gAENwIigAp3zz33yDAMjR8/3mv7F198IcMwLKrKWqNGjVJ0dLQ2btyoH374odTHT548Wf/5z398XxgAiIAIoJJERERowoQJOnTokNWl+MyJEyfKfOyWLVvUoUMHNWzYUAkJCaU+Pj4+XtWqVSvz9QHgbAiIACpFly5dVLduXY0bN+6M+4wePbpId+vLL7+sRo0aeZ67u1aff/551alTR9WqVdMzzzyjkydPaujQoapRo4YaNGigf//730XO/+uvv+ryyy9XRESEWrZsqfnz53u9vn79el133XWKiYlRnTp11KdPH+3fv9/z+tVXX63+/fvrscceU82aNdW1a9di34fT6dSYMWPUoEEDhYeHq23btpo1a5bndcMwtGLFCo0ZM0aGYWj06NHFnufTTz9V69atFRkZqYSEBHXp0kW5ublen4Nbbm6u7rrrLsXExKhevXqaOHFikfOdOHFCTzzxhM477zxFR0fr0ksv9foMtm3bpp49e6p69eqKjo5Wy5Yt9e233xZbW3HcP78PPvhAjRo1Unx8vP76178qJyenxOcA4B8IiAAqhd1u1/PPP69XX31Vf/75Z7nONXfuXO3atUsLFy7USy+9pNGjR+uGG25Q9erVtWTJEvXt21d9+/bVjh07vI4bOnSohgwZolWrVunyyy9Xr169dODAAUlSZmamOnbsqLZt22r58uWaNWuW9uzZo9tvv93rHO+//75CQkL0008/6a233iq2vsmTJ2vixIl68cUXtWbNGnXv3l29evXSpk2bPNdq2bKlhgwZoszMTD3++ONFzpGZmak77rhD9913nzZs2KD58+fr5ptvlmmaxV5z6NChmjdvnmbMmKHZs2dr/vz5WrFihdc+9957r3766SdNnz5da9as0W233aZrr73WU1e/fv2Ul5enhQsXKiMjQxMmTFBMTEwJfiKnbNmyRV988YW++eYbffPNN1qwYEGRWwsAVAEmAFSwu+++27zxxhtN0zTNyy67zLzvvvtM0zTNGTNmmIX/GRo1apTZpk0br2MnTZpkNmzY0OtcDRs2NB0Oh2dbUlKSeeWVV3qenzx50oyOjjY//vhj0zRNc+vWraYkc/z48Z598vPzzQYNGpgTJkwwTdM0R4wYYXbr1s3r2jt27DAlmRs3bjRN0zQ7duxotm3b9pzvt379+uZzzz3nte3iiy82H3nkEc/zNm3amKNGjTrjOVasWGFKMv/4449iXy/8mebk5JhhYWHm9OnTPa8fOHDAjIyMNAcOHGiapmlu3rzZNAzD3Llzp9d5OnfubA4bNsw0TdNs3bq1OXr06HO+vzMZNWqUGRUVZWZnZ3u2DR061Lz00kvLfE4A1gixNp4CCDYTJkxQp06dNGTIkDKfo2XLlrLZTnWA1KlTR61atfI8t9vtSkhI0N69e72Oa9++vef7kJAQpaWlacOGDZKkFStWaN68ecW2mG3ZskXNmzeXJKWlpZ21tuzsbO3atUtXXHGF1/YrrrhCq1evLuE7lNq0aaPOnTurdevW6t69u7p166Zbb71V1atXL7a+EydOeL2/GjVqKCkpyfN85cqVMk3T8z7c8vLyPPdADhgwQA8//LBmz56tLl266JZbblFqamqJa5akRo0aKTY21vO8Xr16RX4OAPwfXcwAKtVVV12l7t27a/jw4UVes9lsRbpQ8/Pzi+wXGhrq9dwwjGK3OZ3Oc9bjHkXtdDrVs2dPpaenez02bdqkq666yrN/dHT0Oc9Z+LxupmmWasS23W7XnDlzNHPmTLVo0UKvvvqqkpKStHXr1iL7nv6ZFcfpdMput2vFihVe72/Dhg2aPHmyJOmBBx7Q77//rj59+igjI0NpaWl69dVXS1yzVPzPpiQ/BwD+hYAIoNKNHz9eX3/9tX7++Wev7bVq1dLu3bu9Ao8v5y5cvHix5/uTJ09qxYoVSk5OliRdeOGFWrdunRo1aqRmzZp5PUoaCiUpLi5O9evX16JFi7y2//zzz0pJSSlVvYZh6IorrtAzzzyjVatWKSwsTDNmzCiyX7NmzRQaGur1/g4dOqTffvvN87xdu3ZyOBzau3dvkfdXt25dz36JiYnq27evPv/8cw0ZMkTvvPNOqWoGEBjoYgZQ6Vq3bq2//e1vRVqnrr76au3bt0//+te/dOutt2rWrFmaOXOm4uLifHLd119/XRdccIFSUlI0adIkHTp0SPfdd58k1wCNd955R3fccYeGDh2qmjVravPmzZo+fbreeecd2e32El9n6NChGjVqlJo2baq2bdtq6tSpSk9P10cffVTicyxZskQ//PCDunXrptq1a2vJkiXat29fsSEzJiZG999/v4YOHaqEhATVqVNHTz31lFc3fPPmzfW3v/1Nd911lyZOnKh27dpp//79mjt3rlq3bq3rrrtOgwYNUo8ePdS8eXMdOnRIc+fOLXWoBRAYaEEEYImxY8cW6RpNSUnRG2+8oddff11t2rTR0qVLix3hW1bjx4/XhAkT1KZNG/3444/68ssvVbNmTUlS/fr19dNPP8nhcKh79+5q1aqVBg4cqPj4eK+gVRIDBgzQkCFDNGTIELVu3VqzZs3SV199pQsuuKDE54iLi9PChQt13XXXqXnz5nr66ac1ceJE9ejRo9j9X3jhBV111VXq1auXunTpog4dOuiiiy7y2mfq1Km66667NGTIECUlJalXr15asmSJEhMTJUkOh0P9+vVTSkqKrr32WiUlJemNN97wHN+oUaMzTskDILAYZkluXgEABLVjx46pRo0a+vbbb3XNNddYXQ6ACkYLIgDgnBYsWKBOnToRDoEgQQsiAAAAvNCCCAAAAC8ERAAAAHghIAIAAMALAREAAABeCIgAAADwQkAEAACAFwIiAAAAvBAQAQAA4IWACAAAAC//Hwy5uGOPSC9IAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.axhline(y=np.pi, color='r', linestyle='-')  # 绘制$\\pi$的真实值参考线\n",
    "plt.plot(n_array, B_array, color='b', marker='x')  # 绘制$\\pi$的下界估计值\n",
    "plt.plot(n_array, A_array, color='g', marker='x')  # 绘制$\\pi$的上界估计值\n",
    "plt.fill_between(n_array, B_array, A_array, color='#DEEAF6')  # 填充上界与下界之间的区域\n",
    "plt.tight_layout()\n",
    "plt.xticks([6, 12, 24, 48, 96])  # 设置x轴刻度\n",
    "plt.xlim((6, 96))  # 设置x轴范围\n",
    "plt.xlabel('Number of sides, n')  # x轴标签\n",
    "plt.ylabel(r'Estimate of $\\pi$')  # y轴标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
